18b174f
@@ -22,6 +22,9 @@
 
 package org.jboss.as.jaxrs.deployment;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import org.jboss.as.server.deployment.Attachments;
 import org.jboss.as.server.deployment.DeploymentPhaseContext;
 import org.jboss.as.server.deployment.DeploymentUnit;
@@ -30,9 +33,12 @@
import org.jboss.as.server.deployment.DeploymentUnitProcessor;
 import org.jboss.as.server.deployment.module.ModuleDependency;
 import org.jboss.as.server.deployment.module.ModuleSpecification;
 import org.jboss.as.ee.weld.WeldDeploymentMarker;
+import org.jboss.as.server.deployment.module.ResourceRoot;
 import org.jboss.modules.Module;
 import org.jboss.modules.ModuleIdentifier;
 import org.jboss.modules.ModuleLoader;
+import org.jboss.modules.filter.PathFilters;
+import org.jboss.vfs.VirtualFile;
 
 /**
  * Deployment processor which adds a module dependencies for modules needed for JAX-RS deployments.
@@ -68,41 +74,63 @@
public class JaxrsDependencyProcessor implements DeploymentUnitProcessor {
      */
     public static final ModuleIdentifier JACKSON_CORE_ASL = ModuleIdentifier.create("org.codehaus.jackson.jackson-core-asl");
 
+    private static final String CLIENT_BUILDER = "META-INF/services/javax.ws.rs.client.ClientBuilder";
+
     public void deploy(DeploymentPhaseContext phaseContext) throws DeploymentUnitProcessingException {
         final DeploymentUnit deploymentUnit = phaseContext.getDeploymentUnit();
         final ModuleSpecification moduleSpecification = deploymentUnit.getAttachment(Attachments.MODULE_SPECIFICATION);
 
+        boolean deploymentBundlesClientBuilder = isClientBuilderInDeployment(deploymentUnit);
+
         final ModuleLoader moduleLoader = Module.getBootModuleLoader();
-        addDependency(moduleSpecification, moduleLoader, JAXRS_API, false);
-        addDependency(moduleSpecification, moduleLoader, JAXB_API, false);
-        addDependency(moduleSpecification, moduleLoader, JSON_API, false);
+        addDependency(moduleSpecification, moduleLoader, JAXRS_API, false, false);
+        addDependency(moduleSpecification, moduleLoader, JAXB_API, false, false);
+        addDependency(moduleSpecification, moduleLoader, JSON_API, false, false);
 
         //we need to add these from all deployments, as they could be using the JAX-RS client
 
-        addDependency(moduleSpecification, moduleLoader, RESTEASY_ATOM, true);
-        addDependency(moduleSpecification, moduleLoader, RESTEASY_VALIDATOR_11, true);
-        addDependency(moduleSpecification, moduleLoader, RESTEASY_JAXRS, true);
-        addDependency(moduleSpecification, moduleLoader, RESTEASY_JAXB, true);
-        addDependency(moduleSpecification, moduleLoader, RESTEASY_JACKSON2, true);
-        addDependency(moduleSpecification, moduleLoader, RESTEASY_JSON_P_PROVIDER, true);
+        addDependency(moduleSpecification, moduleLoader, RESTEASY_ATOM, true, false);
+        addDependency(moduleSpecification, moduleLoader, RESTEASY_VALIDATOR_11, true, false);
+        addDependency(moduleSpecification, moduleLoader, RESTEASY_JAXRS, true, deploymentBundlesClientBuilder);
+        addDependency(moduleSpecification, moduleLoader, RESTEASY_JAXB, true, false);
+        addDependency(moduleSpecification, moduleLoader, RESTEASY_JACKSON2, true, false);
+        addDependency(moduleSpecification, moduleLoader, RESTEASY_JSON_P_PROVIDER, true, false);
         //addDependency(moduleSpecification, moduleLoader, RESTEASY_JETTISON);
-        addDependency(moduleSpecification, moduleLoader, RESTEASY_JSAPI, true);
-        addDependency(moduleSpecification, moduleLoader, RESTEASY_MULTIPART, true);
-        addDependency(moduleSpecification, moduleLoader, RESTEASY_YAML, true);
-        addDependency(moduleSpecification, moduleLoader, JACKSON_CORE_ASL, true);
-        addDependency(moduleSpecification, moduleLoader, RESTEASY_CRYPTO, true);
-        addDependency(moduleSpecification, moduleLoader, JACKSON_DATATYPE_JDK8, true);
-        addDependency(moduleSpecification, moduleLoader, JACKSON_DATATYPE_JSR310, true);
+        addDependency(moduleSpecification, moduleLoader, RESTEASY_JSAPI, true, false);
+        addDependency(moduleSpecification, moduleLoader, RESTEASY_MULTIPART, true, false);
+        addDependency(moduleSpecification, moduleLoader, RESTEASY_YAML, true, false);
+        addDependency(moduleSpecification, moduleLoader, JACKSON_CORE_ASL, true, false);
+        addDependency(moduleSpecification, moduleLoader, RESTEASY_CRYPTO, true, false);
+        addDependency(moduleSpecification, moduleLoader, JACKSON_DATATYPE_JDK8, true, false);
+        addDependency(moduleSpecification, moduleLoader, JACKSON_DATATYPE_JSR310, true, false);
 
         if (WeldDeploymentMarker.isPartOfWeldDeployment(deploymentUnit)) {
-            addDependency(moduleSpecification, moduleLoader, RESTEASY_CDI, true);
+            addDependency(moduleSpecification, moduleLoader, RESTEASY_CDI, true, false);
+        }
+
+    }
+
+    private boolean isClientBuilderInDeployment(DeploymentUnit deploymentUnit) {
+        ResourceRoot root = deploymentUnit.getAttachment(Attachments.DEPLOYMENT_ROOT);
+        List<ResourceRoot> roots = new ArrayList<>(deploymentUnit.getAttachmentList(Attachments.RESOURCE_ROOTS));
+        roots.add(root);
+        for(ResourceRoot r : roots) {
+            VirtualFile file  = r.getRoot().getChild(CLIENT_BUILDER);
+            if(file.exists()) {
+                return true;
+            }
         }
 
+        return false;
     }
 
     private void addDependency(ModuleSpecification moduleSpecification, ModuleLoader moduleLoader,
-                               ModuleIdentifier moduleIdentifier, boolean optional) {
-        moduleSpecification.addSystemDependency(new ModuleDependency(moduleLoader, moduleIdentifier, optional, false, true, false));
+                               ModuleIdentifier moduleIdentifier, boolean optional, boolean deploymentBundelesClientBuilder) {
+        ModuleDependency dependency = new ModuleDependency(moduleLoader, moduleIdentifier, optional, false, true, false);
+        if(deploymentBundelesClientBuilder) {
+            dependency.addImportFilter(PathFilters.is(CLIENT_BUILDER), false);
+        }
+        moduleSpecification.addSystemDependency(dependency);
     }
 
     @Override
